package edu.northwestern.cbits.purplescope;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class HomeActivity extends ActionBarActivity
{
public static final String UPDATE_INTERFACE = "update_interface";
private Menu _menu = null;
private BroadcastReceiver _receiver = null;
private ArrayAdapter<String> _adapter = null;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_home);
String[] resources = this.deviceResources();
final HomeActivity me = this;
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
this._adapter = new ArrayAdapter<String>(this, R.layout.row_resource, resources)
{
public View getView (int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
LayoutInflater inflater = (LayoutInflater) me.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_resource, null);
}
final String item = this.getItem(position);
CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.resource_check);
checkbox.setText(item);
checkbox.setEnabled(ScopeService.isSampling() == false);
checkbox.setChecked(prefs.contains(item));
checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton view, boolean checked)
{
Editor e = prefs.edit();
if (checked)
e.putBoolean(item, true);
else
e.remove(item);
e.commit();
}
});
return convertView;
}
};
ListView resourceList = (ListView) this.findViewById(R.id.capture_list);
resourceList.setAdapter(this._adapter);
}
public void onResume()
{
super.onResume();
if (this._receiver == null)
{
final HomeActivity me = this;
this._receiver = new BroadcastReceiver()
{
public void onReceive(Context context, Intent intent)
{
TextView minute = (TextView) me.findViewById(R.id.minute_field);
TextView second = (TextView) me.findViewById(R.id.second_field);
long duration = intent.getLongExtra(ScopeService.DURATION, 0);
long seconds = duration / 1000;
long minutes = seconds / 60;
seconds = seconds % 60;
if (minutes < 10)
minute.setText("0" + minutes);
else
minute.setText("" + minutes);
if (seconds < 10)
second.setText(":0" + seconds);
else
second.setText(":" + seconds);
MenuItem pause = me._menu.findItem(R.id.pause_button);
MenuItem play = me._menu.findItem(R.id.play_button);
if (ScopeService.isSampling())
{
pause.setVisible(true);
play.setVisible(false);
}
else
{
play.setVisible(true);
pause.setVisible(false);
}
me._adapter.notifyDataSetChanged();
}
};
IntentFilter filter = new IntentFilter(HomeActivity.UPDATE_INTERFACE);
LocalBroadcastManager broadcasts = LocalBroadcastManager.getInstance(this);
broadcasts.registerReceiver(this._receiver, filter);
}
}
public void onPause()
{
super.onPause();
if (this._receiver != null)
{
LocalBroadcastManager broadcasts = LocalBroadcastManager.getInstance(this);
broadcasts.unregisterReceiver(this._receiver);
this._receiver = null;
}
}
public boolean onCreateOptionsMenu(Menu menu)
{
this.getMenuInflater().inflate(R.menu.menu_home, menu);
this._menu = menu;
return true;
}
private String[] deviceResources()
{
String cpu = this.getString(R.string.resource_cpu);
String battery = this.getString(R.string.resource_battery);
String robotMemory = this.getString(R.string.resource_memory_robot);
String funfMemory = this.getString(R.string.resource_memory_funf);
// String robotDisk = this.getString(R.string.resource_disk_robot);
// String funfDisk = this.getString(R.string.resource_disk_funf);
String[] resources = { cpu, battery, robotMemory, funfMemory }; // , robotDisk, funfDisk };
return resources;
}
public boolean onOptionsItemSelected(final MenuItem item)
{
final HomeActivity me = this;
if (item.getItemId() == R.id.play_button)
{
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View sessionView = inflater.inflate(R.layout.layout_session, null);
final SeekBar duration = (SeekBar) sessionView.findViewById(R.id.duration_size);
duration.setMax(59);
duration.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
TextView durationLabel = (TextView) sessionView.findViewById(R.id.duration_text);
int seconds = (progress + 1) * 30;
int minutes = seconds / 60;
seconds = seconds % 60;
String minutesText = "" + minutes;
if (minutes < 10)
minutesText = "0" + minutes;
String secondsText = "" + seconds;
if (seconds < 10)
secondsText = "0" + seconds;
durationLabel.setText(minutesText + ":" + secondsText);
}
public void onStartTrackingTouch(SeekBar seekBar)
{
}
public void onStopTrackingTouch(SeekBar seekBar)
{
}
});
duration.setProgress(29);
final EditText name = (EditText) sessionView.findViewById(R.id.session_name);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder = builder.setTitle(R.string.begin_session);
builder = builder.setView(sessionView);
builder = builder.setPositiveButton(R.string.begin_session, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
MenuItem pause = me._menu.findItem(R.id.pause_button);
pause.setVisible(true);
item.setVisible(false);
int halfMinutes = duration.getProgress() + 1;
Intent intent = new Intent(ScopeService.BEGIN_SAMPLING);
intent.putExtra(ScopeService.DURATION, 1000L * 30 * halfMinutes);
intent.putExtra(ScopeService.SESSION_NAME, name.getText().toString());
me.startService(intent);
}
});
builder.create().show();
}
else if (item.getItemId() == R.id.pause_button)
{
MenuItem pause = this._menu.findItem(R.id.play_button);
pause.setVisible(true);
item.setVisible(false);
Intent intent = new Intent(ScopeService.END_SAMPLING);
this.startService(intent);
}
else if (item.getItemId() == R.id.save_button)
{
File externalDir = this.getExternalFilesDir(null);
if (externalDir.exists() == false)
externalDir.mkdirs();
try
{
File root = this.getFilesDir().getParentFile();
File databases = new File(root, "databases");
FileUtils.copyFileToDirectory(new File(databases, PerformanceContentProvider.DATABASE), externalDir);
Toast.makeText(this, R.string.database_available, Toast.LENGTH_LONG).show();
}
catch (IOException e)
{
e.printStackTrace();
Toast.makeText(this, R.string.database_error, Toast.LENGTH_LONG).show();
}
}
else if (item.getItemId() == R.id.reset_button)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder = builder.setTitle(R.string.clear_database);
builder = builder.setMessage(R.string.confirm_clear);
builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface arg0, int arg1)
{
int deleted = me.getContentResolver().delete(PerformanceContentProvider.PERFORMANCE_VALUES, "_id != -1", null);
Toast.makeText(me, me.getString(R.string.delete_count, deleted), Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface arg0, int arg1)
{
}
});
builder.create().show();
}
return true;
}
}